﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace XCoder
{
    /// <summary>
    /// 数据类型架构
    /// </summary>
    internal class XDataType
    {
        /// <summary>
        /// 类型标识
        /// </summary>
        public int TypeID { get; set; }

        /// <summary>
        /// 类型名称
        /// </summary>
        public string TypeName { get; set; }

        /// <summary>
        /// 数据类型
        /// </summary>
        public string DataType { get; set; }

        /// <summary>
        /// 类型大小定义
        /// </summary>
        public long ColumnSize { get; set; }

        public override string ToString()
        {
            return string.Concat(this.TypeID.ToString(), this.DataType);
        }

        /// <summary>
        /// 将数据行转换为表架构信息
        /// </summary>
        /// <param name="row"> 数据行 </param>
        /// <param name="dbType"> 数据库类型 </param>
        /// <returns></returns>
        public static XDataType Parse(System.Data.DataRow row, System.Data.DatabaseType dbType)
        {
            XDataType model = new XDataType();
            if (row != null)
            {
                if (dbType == System.Data.DatabaseType.Access)
                {
                    #region Access
                    {
                        //  类型名称
                        if (row.Table.Columns.Contains("TypeName"))
                            model.TypeName = row["TypeName"] as string;
                        //  类型标识
                        if (row.Table.Columns.Contains("NativeDataType") && row["NativeDataType"] != null && row["NativeDataType"] != DBNull.Value)
                            model.TypeID = !string.IsNullOrEmpty(row["NativeDataType"].ToString()) ? int.Parse(row["NativeDataType"].ToString()) : -1;
                        //  类型大小定义
                        if (row.Table.Columns.Contains("ColumnSize") && row["ColumnSize"] != null && row["ColumnSize"] != DBNull.Value)
                            model.ColumnSize = long.Parse(row["ColumnSize"].ToString());
                        //  数据类型
                        if (row.Table.Columns.Contains("DataType") && row["DataType"] != null && row["DataType"] != DBNull.Value)
                            model.DataType = row["DataType"].ToString();
                    }
                    #endregion
                }
                else
                {
                    #region 公共
                    {
                        //  类型名称
                        if (row.Table.Columns.Contains("TypeName"))
                            model.TypeName = row["TypeName"] as string;
                        //  类型标识
                        if (row.Table.Columns.Contains("ProviderDbType") && row["ProviderDbType"] != null && row["ProviderDbType"] != DBNull.Value)
                            model.TypeID = (int)row["ProviderDbType"];
                        //  类型大小定义
                        if (row.Table.Columns.Contains("ColumnSize") && row["ColumnSize"] != null && row["ColumnSize"] != DBNull.Value)
                            model.ColumnSize = long.Parse(row["ColumnSize"].ToString());
                        //  数据类型
                        if (row.Table.Columns.Contains("DataType") && row["DataType"] != null && row["DataType"] != DBNull.Value)
                            model.DataType = row["DataType"].ToString();
                    }
                    #endregion
                }
            }
            return model;
        }

        /// <summary>
        /// 将数据源转换为表架构集合信息
        /// </summary>
        /// <param name="source"> 数据源 </param>
        /// <param name="dbType"> 数据库类型 </param>
        /// <returns></returns>
        public static System.Collections.Generic.List<XDataType> Parse(System.Data.DataTable source, System.Data.DatabaseType dbType)
        {
            System.Collections.Generic.List<XDataType> models = new System.Collections.Generic.List<XDataType>();
            if (source != null && source.Rows.Count > 0)
            {
                foreach (System.Data.DataRow row in source.Rows)
                {
                    models.Add(XDataType.Parse(row, dbType));
                }
            }
            return models;
        }
    }
}
